#include <intr/idt.h>
#include <asm/gdt.h>
#include <mem/mem.h>
#include <printk.h>
#include <asm/tss.h>

void init_tss()
{
    // TssSeg = (sys_seg_desc_t *)(GdtTable+TSSINDEX);
    i32_t i;
    u64_t sys_stack = 0;
    u64_t tmp = 0;
    for (i = 0; i < __mem_map.size; i++)
    {
        if (__mem_map.mem[i].type == 1)
        { // 可用内存
            tmp = __mem_map.mem[i].addr + __mem_map.mem[i].len;
            if (tmp < 0x100000)
            {
                sys_stack = tmp;
            }
        }
    }

    TssVal.ist1 = sys_stack + KERNEL_BASE; // 中断栈1(128K)
    sys_stack -= 0x20000;
    TssVal.rsp2 = sys_stack + KERNEL_BASE; // DPL=2时的堆栈(128K)
    sys_stack -= 0x20000;
    TssVal.rsp1 = sys_stack + KERNEL_BASE; // DPL=1时的堆栈(128K)
    sys_stack -= 0x20000;
    TssVal.rsp0 = sys_stack + KERNEL_BASE; // DPL=0时的堆栈
}